home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / CW GUSI 1.6.4 / include / GUSIINET_P.h < prev    next >
C/C++ Source or Header  |  1995-11-05  |  6KB  |  203 lines

  1. /*********************************************************************
  2. Project    :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIINET_P.h    -    Common definitions for TCP/IP Sockets
  4. Author    :    Matthias Neeracher
  5.  
  6.     This file was derived from the socket library by 
  7.     
  8.         Charlie Reiman    <creiman@ncsa.uiuc.edu> and
  9.         Tom Milligan    <milligan@madhaus.utcs.utoronto.ca>
  10.           
  11. Language    :    MPW C/C++
  12.  
  13. $Log: GUSIINET_P.h,v $
  14. Revision 1.4  1994/12/31  02:17:14  neeri
  15. Wakeup gear.
  16.  
  17. Revision 1.3  1994/08/10  00:39:17  neeri
  18. Sanitized for universal headers.
  19.  
  20. Revision 1.2  1994/05/01  23:50:43  neeri
  21. INETScoketDomain::Open/CloseSocket()
  22.  
  23. Revision 1.1  1994/02/25  02:57:11  neeri
  24. Initial revision
  25.  
  26. Revision 0.7  1993/09/01  00:00:00  neeri
  27. Turn terminus into a short
  28.  
  29. Revision 0.6  1993/06/17  00:00:00  neeri
  30. UDPSocket::getsockname()
  31.  
  32. Revision 0.5  1993/01/31  00:00:00  neeri
  33. Support for inetd
  34.  
  35. Revision 0.4  1993/01/21  00:00:00  neeri
  36. Remove torecv
  37.  
  38. Revision 0.3  1993/01/08  00:00:00  neeri
  39. tcp_notify was setting the wrong stream to unconnected
  40.  
  41. Revision 0.2  1992/08/23  00:00:00  neeri
  42. Available()
  43.  
  44. Revision 0.1  1992/08/20  00:00:00  neeri
  45. First approach
  46.  
  47. *********************************************************************/
  48.  
  49. #include "GUSI_P.h"
  50.  
  51. #include <Devices.h>
  52. #include <MacTCP.h>
  53.  
  54. #define STREAM_BUFFER_SIZE    16384
  55. #define UDP_MAX_MSG            65507    /* MacTCP max legal udp message */
  56. #define TCP_MAX_MSG            65535    /* MacTCP max legal tcp message */
  57.  
  58. #define TCP_MAX_WDS        4        /* arbitrary number of wds to alloc in sock_tcp_send */
  59.  
  60. class INETSocket : public Socket    {                // That's what this file's all about
  61.     friend class INETSocketDomain;    
  62.  
  63. #if !GENERATINGCFM
  64.     Ptr                        processA5;    /* Our A5 world */
  65. #endif    
  66.  
  67. protected:
  68.     StreamPtr                stream;        /* stream pointer */
  69.     UInt8                        status;        /* Is file descriptor in use */
  70.     Boolean                    nonblocking;/* socket set for non-blocking I/O. */
  71.     char *                    recvBuf;        /* receive buffer */
  72.     int                        recvd;        /* amount received */
  73.     struct sockaddr_in    sa;            /* My address. */
  74.     struct sockaddr_in    peer;            /* Her address. */
  75.     UInt8                        sstate;        /* socket's connection state. */
  76.     int                        asyncerr;    /* Last async error to arrive.  zero if none. */
  77.                     INETSocket();
  78.                     INETSocket(StreamPtr stream);
  79.                     
  80.     virtual         ~INETSocket();
  81.     
  82.     virtual u_long    Available();
  83. public:
  84.     void            Ready();
  85.  
  86.     virtual int        bind(void * name, int namelen);
  87.     virtual int     getsockname(void * name, int * namelen);
  88.     virtual int     getpeername(void * name, int * namelen);
  89.     virtual int        fcntl(unsigned int cmd, int arg);
  90.     virtual int        ioctl(unsigned int request, void *argp);
  91.     virtual int     shutdown(int how);
  92. };    
  93.  
  94. class AnnotatedPB;
  95.  
  96. class TCPSocket : public INETSocket    {    
  97.     friend class INETSocketDomain;
  98.     friend class INETdSocketDomain;
  99.     friend pascal void tcp_notify(StreamPtr, u_short, Ptr, u_short, struct ICMPReport *);
  100.     friend void tcp_connect_done(AnnotatedPB *);
  101.     friend void tcp_listen_done(AnnotatedPB *);
  102.     friend void tcp_recv_done(AnnotatedPB *);
  103.     friend void tcp_send_done(AnnotatedPB *);
  104.  
  105. // Since an userDataPtr may not be changed during the lifetime of a stream, we need
  106. // this indirection. The class invariant *(this->self) == this holds.
  107.  
  108.     TCPSocket **    self;
  109.  
  110.                         TCPSocket();
  111.                         TCPSocket(StreamPtr stream);
  112.                         TCPSocket(TCPSocket * sock);
  113.                     
  114.     virtual             ~TCPSocket();
  115.     TCPiopb *        GetPB();
  116.     virtual u_long    Available();
  117. public:
  118.     virtual int     connect(void * address, int addrlen);
  119.     virtual int     listen(int qlen);
  120.     virtual Socket * accept(void * address, int * addrlen);
  121.     virtual int     recvfrom(void * buffer, int buflen, int flags, void * from, int * fromlen);
  122.     virtual int     sendto(void * buffer, int buflen, int flags, void * to, int tolen);
  123.     virtual int     select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
  124. };    
  125.  
  126. class UDPSocket : public INETSocket    {    
  127.     friend class INETSocketDomain;    
  128.     friend class INETdSocketDomain;    
  129.     friend void udp_read_ahead_done(AnnotatedPB *);
  130.  
  131.                         UDPSocket();
  132.                         UDPSocket(StreamPtr stream);
  133.     virtual             ~UDPSocket();
  134.     UDPiopb *        GetPB();
  135.     virtual u_long    Available();
  136.     int                NewStream();
  137.     int                FlushReadAhead();
  138.     int                ReadAhead();
  139. public:
  140.     virtual int        bind(void * name, int namelen);
  141.     virtual int     getsockname(void * name, int * namelen);
  142.     virtual int     connect(void * address, int addrlen);
  143.     virtual int     recvfrom(void * buffer, int buflen, int flags, void * from, int * fromlen);
  144.     virtual int     sendto(void * buffer, int buflen, int flags, void * to, int tolen);
  145.     virtual int     select(Boolean * canRead, Boolean * canWrite, Boolean * exception);
  146. };    
  147.  
  148. class AnnotatedPB {
  149.     union {
  150.         TCPiopb        tcp;
  151.         UDPiopb        udp;
  152.     } pb;
  153.     INETSocket    *    sock;
  154. public:
  155.     void                SetOwner(INETSocket * s)        {    sock    =    s;                            }
  156.     INETSocket *    Owner()                                {    return sock;                        }
  157.     TCPiopb *        TCP()                                    {    return &pb.tcp;                    }
  158.     UDPiopb *        UDP()                                    {    return &pb.udp;                    }
  159.     Boolean            Busy()                                {    return pb.tcp.ioResult == 1;    }
  160. };
  161.  
  162. #if PRAGMA_ALIGN_SUPPORTED
  163. #pragma options align=mac68k
  164. #endif
  165. struct miniwds {
  166.     u_short    length;
  167.     char *     ptr;
  168.     short        terminus;    /* must be zero'd for use */
  169. };
  170. #if PRAGMA_ALIGN_SUPPORTED
  171. #pragma options align=reset
  172. #endif
  173.  
  174. class INETSocketDomain : public SocketDomain {
  175.     OSErr                driverState;
  176.     OSErr                resolverState;
  177.     short                drvrRefNum;
  178.     short                inetCount;                            /* # of existing sockets */
  179.     short             pbLast;                                /* last pb used */
  180.     AnnotatedPB *    pbList;                                /* The pb array */
  181. public:
  182.     INETSocketDomain();
  183.     
  184.     short                Driver();
  185.     OSErr                Resolver();
  186.     AnnotatedPB *    GetPB();
  187.     void                 OpenSocket();
  188.     void                CloseSocket();
  189.     
  190.     virtual Socket *     socket(int type, short protocol);
  191. };
  192.  
  193. extern INETSocketDomain    INETSockets;
  194.  
  195. int TCP_error(int MacTCPerr);
  196.  
  197. #if GENERATINGCFM
  198. inline void INETSocket::Ready() 
  199. {
  200.     INETSockets.Ready();
  201. }
  202. #endif    
  203.